package com.catjiu.webeditor.parser;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.catjiu.webeditor.ParserContext;
import com.catjiu.webeditor.style.Style;
import org.apache.poi.xwpf.usermodel.*;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TableNodeParser extends NodeParser{
    @Override
    public void parser(ParserContext context, Style style) {
        Element tNode = (Element) getNode();
        Element tbody = tNode.children().get(0);
        //计算需要的行列数
        Elements rows = tbody.getElementsByTag("tr");
        int rowNum = rows.size();
        if(rowNum<1){
            return;
        }
        Elements cells = rows.get(0).getElementsByTag("td");
        int cellNUm = 0;
        for (Element cell : cells) {
            String colspan = cell.attr("colspan");
            if(StrUtil.isEmpty(colspan)){
                cellNUm++;
            }else{
                cellNUm+= Integer.parseInt(colspan);
            }
        }
        //创建表格
        XWPFTable table = context.createTable(rowNum,cellNUm);
        table.setWidth("100%");
        //用int记录单元格状态，0，未被使用，1，已加入到merger
        int flag = 1;
        int[][] tableBit = new int[rowNum][cellNUm];
        double width = 100.0/cellNUm;
        for(int i=0;i<rows.size();i++){
            XWPFTableRow tableRow = table.getRow(i)==null?table.createRow():table.getRow(i);
            cells = rows.get(i).getElementsByTag("td");
            for(int j=0,cellIndex = 0; j<cellNUm;j++){
                XWPFTableCell tableCell = tableRow.getCell(j)==null?tableRow.createCell():tableRow.getCell(j);
                tableCell.setWidth(width+"%");
                if(tableBit[i][j] != 0){
                    //跳过的单元格看是否有段落，没有则添加段落，要填值的段落无需处理，在填值时会添加段落
                    //PS:如果单元格无段落，会导致生成的word打开出现问题。
                    if(CollUtil.isEmpty(tableCell.getParagraphs())){
                        tableCell.addParagraph();
                    }
                    continue;
                }
                Node cell = cells.get(cellIndex++);
                context.setCell(tableCell);
                //交给cell解析
                new CellNodeParser().build(cell).parser(context,null);
                String rowspan = cell.attr("rowspan");
                String colspan = cell.attr("colspan");
                if(StrUtil.isEmpty(rowspan) && StrUtil.isEmpty(colspan)){
                    tableBit[i][j] = flag++;
                }else{
                    int mergeRow = StrUtil.isEmpty(rowspan)?1:Integer.parseInt(rowspan);
                    int mergeCol = StrUtil.isEmpty(colspan)?1:Integer.parseInt(colspan);
                    for(int n=0;n<mergeRow;n++){
                        for(int m=0;m<mergeCol;m++){
                            tableBit[i+n][j+m] = flag;
                        }
                    }
                    flag++;
                }
            }
        }
        //合并单元格
        //行合并
        for(int i=0;i<rowNum;i++){
            flag = 0;
            for(int j=0;j<cellNUm;j++){
                //当前位置与前一个位置不同，那么当前位置是一个合并单元格的起点
                if(tableBit[i][j]!=flag){
                    flag = tableBit[i][j];
                    //如果是最后一个，或者下一个和当前都不一样，那么就不需要合并
                    if(j+1>=cellNUm || tableBit[i][j+1] != tableBit[i][j]){
                        continue;
                    }
                    table.getRow(i).getCell(j).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
                }else{
                    table.getRow(i).getCell(j).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                }
            }
        }
        //列合并
        for(int j=0;j<cellNUm;j++){
            flag = 0;
            for (int i=0;i<rowNum;i++){
                if(tableBit[i][j] != flag){
                    flag = tableBit[i][j];
                    //如果是最后一个，或者下一个和当前都不一样，那么就不需要合并
                    if(i+1>=rowNum || tableBit[i+1][j] != tableBit[i][j]){
                        continue;
                    }
                    table.getRow(i).getCell(j).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
                }else{
                    table.getRow(i).getCell(j).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
                }
            }
        }
    }
}
